/** ==================================================================================== **/
/** 							Definizione dei servizi di geocoding  					 **/
/** ==================================================================================== **/

/**
 * Per utilizzare i metodi pubblici del service è necessario iniettare nei propri service e/o controller la classe "GeocoderService".
 */
BootApplication.service('GeocoderService', [ 'log', '$http', 'configuration', '$q', 'GeocoderInfo', 'GeocoderOptions', "$translate",
                                             function( log, $http, appConstants, $q, GeocoderInfo, GeocoderOptions, $translate ) {

	/**
	 * Servizio di Autocomplete
	 * 
	 * Dato un indirizzo, nel formato (CITTA, VIA, N° Civico (opzionale)) ne recupera le coordinate e le informazioni
	 * 
	 * @param {@link String} searchText - Indirizzo da ricercare, Obbligatorio
	 * @param {@link GeocoderOptions} options - opzioni di ricerca 
	 * 
	 * @return
	 * @throws Exception
	 */
	this.autocompletegeo = function(searchText, options) {
		
		var deferred = $q.defer();
		
		$http({
		   url: appConstants.getParam("Constants").autocompletegeo,
		   params: {
				address : searchText,
				categorie : ((angular.isDefined(options) && options.getCategorie() != null) ? options.getCategorie().toString() : null),
				viewbox : ((angular.isDefined(options) && options.getPriorityPosition() != null) ? options.getPriorityPosition().toString() : null),
				callback : 'json.wrf',
				lang : $translate.use()
		   },
		   dataType: 'jsonp',
		   cache: false,
		})
		.success(function(response, status, headers, config) {
    	    try{
    	    	if(response.success && response.aaData != null){
	    	    	var responseArray = [];
					
	    	    	$.each(response.aaData, function(index, item) {	
	    	    		/** **/
						var geoInfo = new GeocoderInfo(
								true, item.indirizzo, item.lon, item.lat, item.codiceLayer, item.citta, item.civico, 
								item.codiceZona, item.categoria, null, item.stradaId, item.regioneId, item.comuneId, item.provinciaId, null);	
						
						/** se l'attributo type è valorizzato, determino anche l'icona **/
						if(angular.isDefined(item.codiceLayer) && !angular.equals(item.codiceLayer, "")) geoInfo.setIcona(Constants.pathIconeGeocoding + item.codiceLayer + ".png");
						
						responseArray.push(geoInfo);
					});
					
					deferred.resolve(responseArray, status);
    	    	}else
    	    		/* response request return false as success */
    	    		deferred.resolve(null, status);
    	    	
    	    }catch(e){
    	    	/* errore nell'elaborazione della risposta */
    	    	log.error("autocompletegeo >>> " + e);
    	    	/* */
    			deferred.reject(null, status);
    	    }
		})
		.error(function(data, status, headers, config) {
			/* errore nella chiamata http */
			log.error("autocompletegeo >>> " + data);
			/* */
			deferred.reject(null, status);
		});
		
		return deferred.promise;
	}// close autocompletegeo
	
	/**
	 * Servizio di Reverse Geocoding
	 * 
	 * Date le coordinate di un punto (lat, lon) ritorna le informazioni della strada in cui ricade il punto
	 * 
	 * @param {@link String} lon - longitudine, Obbligatorio
	 * @param {@link String} lat - latitudine, Obbligatorio
	 * 
	 * @return
	 * @throws Exception
	 */
	this.reversegeo = function(lon, lat) {
		
		var deferred = $q.defer();
		
		$http({
		   url: appConstants.getParam("Constants").reverseGeoCoding,
		   params: {
			    lat : lat,
				lon : lon,
				callback : 'json.wrf'
		   },
		   dataType: 'jsonp',
		   cache: false,
		})
		.success(function(response, status, headers, config) {
    	    try{
    	    	if(response.success && response.aaData != null){
    	    		/** **/
    	    		var item = response.aaData;
    	    		
	    	    	/** **/
    	    		var geoInfo = new GeocoderInfo(
    	    				true, item.indirizzo, item.lon, item.lat, item.codiceLayer, item.citta, item.civico, 
    	    				item.codiceZona, item.categoria, null, item.stradaId, item.regioneId, item.comuneId, item.provinciaId, null);	
						
					/** se l'attributo type è valorizzato, determino anche l'icona **/
					if(angular.isDefined(item.codiceLayer) && !angular.equals(item.codiceLayer, "")) geoInfo.setIcona(Constants.pathIconeGeocoding + item.codiceLayer + ".png");
						
					deferred.resolve(geoInfo, status);
    	    	}else
    	    		/* response request return false as success */
    	    		deferred.resolve(null, status);
    	    	
    	    }catch(e){
    	    	/* errore nell'elaborazione della risposta */
    	    	log.error("reversegeo >>> " + e);
    	    	/* */
    			deferred.reject(null, status);
    	    }
		})
		.error(function(data, status, headers, config) {
			/* errore nella chiamata http */
			log.error("reversegeo >>> " + data);
			/* */
			deferred.reject(null, status);
		});
		
		return deferred.promise;
	}// close reversegeo
	
}]);